package migracion;
import util.*;
import entidades.*;
import java.util.Map;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.io.File;
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;

/**
 * @author JFM
 */
public class MigrarOrdenes
	{
	public static void main(String args[]) throws Exception
		{
		Sheet hoja;
		HSSFWorkbook workbook;
		FileInputStream excel;
		Map<String, Map> soData = new HashMap();
		Map<String, Map> woData = new HashMap();
		int count = 0;

		System.out.println("Leyendo ordenes de venta...");

		excel = new FileInputStream(new File("Migracion_Ordenes_Venta.xls"));
		workbook = new HSSFWorkbook(excel);
		hoja = workbook.getSheetAt(0);

		for(int i=1,n=hoja.getLastRowNum(); i<=n; i++)
			{
			Row fila = hoja.getRow(i);

			String so_wo = fila.getCell(0).getStringCellValue();
			String so = (so_wo != null && so_wo.contains("-"))? so_wo.split("-")[0] : "";
			String wo = (so_wo != null && so_wo.contains("-"))? so_wo.split("-")[1] : "";
			String tipoPapel = fila.getCell(2).getStringCellValue();
			String manija = fila.getCell(1).getStringCellValue();
                        if ( so_wo.equals("00000-27924")){
                            System.out.println("Manija:" + manija);
                        }
                        int colores = (int)fila.getCell(3).getNumericCellValue();
                        String barniz = fila.getCell(4).getStringCellValue();
                        boolean barnizbln = false;
                        if (barniz.equals("SI")){
                            barnizbln = true;
                        }
                        String interior = fila.getCell(6).getStringCellValue();
                        boolean interiorbln = false;
                        if (interior.equals("SI")){
                            interiorbln = true;
                        }
                        String laca = fila.getCell(5).getStringCellValue();
                        int lacauvId = LacaUv.NINGUNO;
                        if (laca.equals("TOTAL")){
                            lacauvId = LacaUv.TOTAL;
                        }else if (laca.equals("SECTORIZADO")){
                            lacauvId = LacaUv.SECTORIZADO;
                        }

                        if(manija != null && manija.length() > 1)
				{
				manija = manija.toLowerCase();
				manija = manija.substring(0,1).toUpperCase() + manija.substring(1);
				}

			Integer manijaId = (manija != null && manija.length() > 0)? Manija.getId(manija) : 0;
			if(manijaId <= 0) manijaId = 1;

			Integer tipoPapelId = (tipoPapel != null && tipoPapel.length() > 0)? TipoPapel.getId(tipoPapel) : 0;
			if(tipoPapelId <= 0) tipoPapelId = 1;

			Map data = new HashMap();
			data.put("so", so);
			data.put("manijaId", manijaId);
			data.put("tipoPapelId", tipoPapelId);
                        data.put("colores", colores);
                        data.put("barnizbln", barnizbln);
                        data.put("interiorbln", interiorbln);
                        data.put("lacauvId", lacauvId);
			soData.put(wo, data);
			}

		System.out.println("Leyendo órdenes de trabajo...");

		excel = new FileInputStream(new File("Migracion_Ordenes_Trabajo.xls"));
		workbook = new HSSFWorkbook(excel);
		hoja = workbook.getSheetAt(0);
                System.out.println ("Leyo archivo");
		for(int i=1,n=hoja.getLastRowNum(); i<=n; i++)
			{
			Row fila = hoja.getRow(i);

			if(fila != null && fila.getCell(2) != null && fila.getCell(2).getStringCellValue() != null && fila.getCell(2).getStringCellValue().length() > 0)
				{
                                    String wo = null;
                                    try {
                                        wo = ((int)fila.getCell(3).getNumericCellValue()) + "";
                                    } catch (Exception e) {
                                        wo = fila.getCell(3).getStringCellValue();
                                    }
//				int newlongId = (int) fila.getCell(1).getNumericCellValue();
				int cantidad =  (int) fila.getCell(6).getNumericCellValue();
				Date fechaPrometida = fila.getCell(8).getDateCellValue();
				String linea = fila.getCell(4).getStringCellValue();
				if(linea != null && linea.length() > 1)
					{
					linea = linea.toLowerCase();
					linea = linea.substring(0,1).toUpperCase() + linea.substring(1);
					if(linea.compareToIgnoreCase("Bio") == 0) linea = "Tierra artesanal";
					}
				String dimensiones = fila.getCell(5).getStringCellValue();
				if(dimensiones != null && dimensiones.length() > 0 )
					{ dimensiones = dimensiones.replaceAll(",", "."); }
				String cliente = fila.getCell(2).getStringCellValue();
				if(cliente != null && cliente.length() > 1)
					{
					cliente = cliente.toLowerCase();
					cliente = cliente.substring(0,1).toUpperCase() + cliente.substring(1);
					}

				int logotipoId = (cliente != null && cliente.length() > 0)? Logotipo.getId(cliente, false) : 0;

				int lineaId = 0;
				ResultSet result = MySQL.executeQuery("SELECT id FROM lineas WHERE descripcion = " + MySQL.format(linea));
                                if(result.next()) { lineaId = result.getInt("id"); }
				result.close();

				int formatoId = 0;
				result = MySQL.executeQuery("SELECT id FROM formatos_view WHERE linea_id = " + MySQL.format(lineaId) + " AND ancho = " + MySQL.format(dimensiones.split("x")[0]) + " AND largo = " + MySQL.format(dimensiones.split("x")[1]) + " AND altura = " + MySQL.format(dimensiones.split("x")[2]));
				if(result.next()) {
                                    formatoId = result.getInt("id");
                                }else{
                                    Dimensiones dimension = Dimensiones.getDimensiones(Float.parseFloat(dimensiones.split("x")[2]), Float.parseFloat(dimensiones.split("x")[0]), Float.parseFloat(dimensiones.split("x")[1]));
                                    if (dimension == null){
                                        dimension = new Dimensiones();
                                        dimension.setAncho(Float.parseFloat(dimensiones.split("x")[0]));
                                        dimension.setLargo(Float.parseFloat(dimensiones.split("x")[1]));
                                        dimension.setAltura(Float.parseFloat(dimensiones.split("x")[2]));
                                        dimension.guardar();
                                    }
                                    Formato f = new Formato();
                                    f.setDesarrollo(0);

                                    f.setLineaId(lineaId);

                                    f.setDimensionesId(dimension.getId());

                                    f.guardar();

                                    formatoId = f.getId();
                                }
				Map data = new HashMap();
//				data.put("newlongId", newlongId);
				data.put("cantidad", cantidad);
				data.put("fechaPrometida", fechaPrometida);
				data.put("logotipoId", logotipoId);
				data.put("lineaId", lineaId);
				data.put("formatoId", formatoId);
				woData.put(wo, data);

				if(soData.get(wo) != null && lineaId > 0)
					{
					Manija.asignarLinea((Integer) soData.get(wo).get("manijaId"), lineaId);
					TipoPapel.asignarLinea((Integer) soData.get(wo).get("tipoPapelId"), lineaId);
					}
				count++;
				}
			}

		System.out.println("Guardando órdenes...");
		Iterator<String> wos = woData.keySet().iterator();
		int pos = 0;
		while(wos.hasNext())
			{
			String wo = wos.next();

			// Obtengo o creo la orden de venta;
			String so = (soData.get(wo) != null)? (String)soData.get(wo).get("so") : null;
			OrdenVenta ov = OrdenVenta.buscar(so);
                        if(ov.getId() <= 0)
				{
//				int manijaId = 1;
//				int tipoPapelId = 1;
//                                int colores = 0 ;
//                                boolean barnizbln = false;
//                                boolean interiorbln = false;
//                                int lacauvId = LacaUv.NINGUNO;
//				if(soData.get(wo) != null)
//					{
				int manijaId = (Integer) soData.get(wo).get("manijaId");
				int tipoPapelId = (Integer) soData.get(wo).get("tipoPapelId");
                                int colores = (Integer) soData.get(wo).get("colores");
                                boolean barnizbln = (Boolean) soData.get(wo).get("barnizbln");
                                boolean interiorbln = (Boolean) soData.get(wo).get("interiorbln");
                                int lacauvId = (Integer) soData.get(wo).get("lacauvId");
//					}
				int lineaId = (Integer) woData.get(wo).get("lineaId");
				int logotipoId = (Integer) woData.get(wo).get("logotipoId");

				ov.setIdentificador(so);
				ov.setAltaUsuarioId(1);
				ov.setAltaFechaHora(new Date());
				ov.setBarniz(barnizbln);
				ov.setCantidadColores(colores);
				ov.setEstadoId(EstadoVenta.AUTORIZADO);
				ov.setInterior(interiorbln);
				ov.setLacaUvId(lacauvId);
                                ov.setManijaId(manijaId);
				ov.setLineaId(lineaId);
				ov.setLogotipoId(logotipoId);
                                
                                // Si son ordenes de chile, dejar esta linea descomentada
                                ov.setPaisId(2);

				ov.setTipoPapelId(tipoPapelId);
				ov.guardar();
				}
                        else{
                            ov.setPaisId(2);
                            ov.guardar();
                        }

			// Creo la orden de trabajo.
			//int newlongId = (Integer) woData.get(wo).get("newlongId");
			int formatoId = (Integer) woData.get(wo).get("formatoId");
                        int linea = (Integer) woData.get(wo).get("lineaId");
			long cantidad = (Integer) woData.get(wo).get("cantidad");
			long metros = OrdenTrabajo.calcularMetros(cantidad, formatoId, false);
			Date fechaPrometida = (Date) woData.get(wo).get("fechaPrometida");

			OrdenTrabajo ot = new OrdenTrabajo();
			ot.setOrdenVenta(ov);
			ot.setOrdenVentaId(ov.getId());
			ot.setCantidad(cantidad);
			ot.setEstadoId(EstadoTrabajo.PENDIENTE);
			ot.setFechaPrometida(fechaPrometida);
			ot.setFormatoId(formatoId);
                        ot.setIdentificador(wo);
			ot.setMetros(metros);

			CicloNewlong cn = getCicloNewlongDisponible(ot, fechaPrometida, linea);
                        
                        /*Fecha para chile entre impresion y confeccion*/
                        Calendar fechaFiltro = Calendar.getInstance();
                        fechaFiltro.setTime(cn.getFechaHoraInicio());
                        fechaFiltro.add(Calendar.DATE,-7);
                        
			
                        CicloUteco cu = getCicloUtecoDisponible(ot, fechaFiltro.getTime());
			ot.setCicloNewlongId(cn.getId());
			ot.setCicloUtecoId(cu.getId());
                        ot.guardar();

			if(pos%(count/10) == 0) { System.out.println((pos*100/count) + " %"); }
			pos++;
			}
		}


	public static CicloNewlong getCicloNewlongDisponible(OrdenTrabajo orden, Date fechaPrometida, int lineaId) throws SQLException
		{
		CicloNewlong cn = new CicloNewlong();
		/*if(orden.getFormato().getId() == 50 && orden.getOrdenVenta().getLinea().getId() == 1){
                    cn = asignarCicloByDefault(orden, fechaPrometida,lineaId);
                }else{
                   */ String query = "SELECT cn.* FROM ciclos_newlong cn INNER JOIN formatos_x_newlong fxn on (cn.newlong_id = fxn.newlong_id) INNER JOIN newlong n on (cn.newlong_id = n.id) INNER JOIN formatos_linea fl on (fl.id_formato = fxn.formato_id) ";
                    query += "WHERE cn.fecha_hora_fin > " + MySQL.format(fechaPrometida) + " AND ";
                    query += "fxn.formato_id = " + orden.getFormatoId() + " AND ";
                    query += "n.pais_id = 2 AND fl.linea_id = " + lineaId ;
                    query += " ORDER BY fecha_hora_fin ASC LIMIT 1";
                    ResultSet result = MySQL.executeQuery(query);
                    if(result.next()) { cn.leer(result); }
                    result.close();
               // }

		return cn;
		}

	public static CicloUteco getCicloUtecoDisponible(OrdenTrabajo orden, Date fechaConfeccion) throws SQLException
		{
		CicloUteco cu = new CicloUteco();

		String query = "SELECT * FROM ciclos_uteco_view WHERE ";
		query += "fecha_hora_fin <= " + MySQL.format(fechaConfeccion);// + " AND ";
		//query += "metros_disponibles >= " + orden.getMetros() + " ";
		query += " ORDER BY numero DESC, metros_disponibles DESC, fecha_hora_fin DESC LIMIT 1";

		ResultSet result = MySQL.executeQuery(query);
		if(result.next()) { cu.leer(result); }
		result.close();

		return cu;
		}

           public static CicloNewlong asignarCicloByDefault(OrdenTrabajo orden, Date fechaPrometida, int lineaId) throws SQLException{
                System.out.println("Formato:" + orden.getFormato().getDimensiones().getDescriptor());
                System.out.println("Linea:" + orden.getOrdenVenta().getLinea().getDescripcion());
                CicloNewlong cn = new CicloNewlong();
                String query = "SELECT cn.* FROM ciclos_newlong cn INNER JOIN formatos_x_newlong fxn on (cn.newlong_id = fxn.newlong_id) INNER JOIN newlong n on (cn.newlong_id = n.id) INNER JOIN formatos_linea fl on (fl.id_formato = fxn.formato_id)  ";
                query += "WHERE cn.fecha_hora_fin > " + MySQL.format(fechaPrometida) + " AND ";
                query += "fxn.formato_id = " + orden.getFormatoId() + " AND fl.linea_id = " + lineaId ;
                query += " AND n.id = 7 ";
                query += " ORDER BY fecha_hora_fin ASC LIMIT 1";

                 ResultSet result = MySQL.executeQuery(query);
                    if(result.next()) {
                         cn.leer(result);
                         System.out.println("Cantidad disponible:" + cn.getCantidadDisponible());
                         if (cn.getCantidadDisponible() <= 0  ){
                             System.out.println("Es menor a cero!!!!!!!!!!!!!!!");
                             cn = asignarCicloSiguiente(orden, fechaPrometida,2,">","ORDER BY fecha_hora_fin ASC LIMIT 1" );
                             if (cn.getCantidadDisponible() <= 0 ){
                                 System.out.println("Es menor a cero newlong 2");
                                 cn = asignarCicloSiguiente(orden, fechaPrometida,7,">","ORDER BY fecha_hora_fin ASC LIMIT 1" );
                             }
                         }
                    }

             return cn;

           }

            public static CicloNewlong asignarCicloSiguiente(OrdenTrabajo orden, Date fechaPrometida, int newlong, String signoFecha, String orderby) throws SQLException{
                System.out.println("Formato:" + orden.getFormato().getDimensiones().getDescriptor());
                System.out.println("Linea:" + orden.getOrdenVenta().getLinea().getDescripcion());
                CicloNewlong cn = new CicloNewlong();
                String query = "SELECT cn.* FROM ciclos_newlong cn INNER JOIN formatos_x_newlong fxn on (cn.newlong_id = fxn.newlong_id) INNER JOIN newlong n on (cn.newlong_id = n.id) ";
                query += "WHERE cn.fecha_hora_fin "+ signoFecha + MySQL.format(fechaPrometida) + " AND ";
                query += "fxn.formato_id = " + orden.getFormatoId() + " AND ";
                query += "n.id = " + newlong + " ";
                query += orderby;

                 ResultSet result = MySQL.executeQuery(query);
                    if(result.next()) {
                         cn.leer(result);
                         System.out.println("Cantidad disponible de newlong "+ newlong + ":" + cn.getCantidadDisponible());
                       }
            return cn;
           }
	}
